package me.exchange.com.utils;

import java.security.SecureRandom;
import java.util.Random;
import java.util.UUID;

public class BaseUtil {

    private final static String[] chars = new String[]{"a", "b", "c", "d", "e", "f",
            "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s",
            "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5",
            "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I",
            "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V",
            "W", "X", "Y", "Z"};
    /**
     * @Description: <p>
     * 短8位UUID思想其实借鉴微博短域名的生成方式，但是其重复概率过高，而且每次生成4个，需要随即选取一个。
     * 本算法利用62个可打印字符，通过随机生成32位UUID，由于UUID都为十六进制，所以将UUID分成8组，
     * 每4个为一组，然后通过模62操作，结果作为索引取出字符，
     * 这样重复率大大降低。
     * </p>
     * @author mazhq
     * @date 2019/8/27 16:16
     */
    public static String buildWebUrlCode() {
        StringBuffer shortBuffer = new StringBuffer();
        String uuid_0 = UUID.randomUUID().toString().replace("-", "");
        String uuid_1 = UUID.randomUUID().toString().replace("-", "");
        String uuid_2 = UUID.randomUUID().toString().replace("-", "");
        String uuid_3 = UUID.randomUUID().toString().replace("-", "");
        String uuid = uuid_0+uuid_1+uuid_2+uuid_3;
        for (int i = 0; i < 32; i++) {
            String str = uuid.substring(i * 4, i * 4 + 4);
            int x = Integer.parseInt(str, 16);
            shortBuffer.append(chars[x % 0x3E]);
        }
        return shortBuffer.toString();

    }
    /**
     * 生成16位不重复的随机数，含数字+大小写
     * @return
     */
    public static String getGUID() {
        StringBuilder uid = new StringBuilder();
        //产生16位的强随机数
        Random rd = new SecureRandom();
        for (int i = 0; i < 16; i++) {
            //产生0-2的3位随机数
            int type = rd.nextInt(3);
            switch (type){
                case 0:
                    //0-9的随机数
                    uid.append(rd.nextInt(10));
                    break;
                case 1:
                    //ASCII在65-90之间为大写,获取大写随机
                    uid.append((char)(rd.nextInt(25)+65));
                    break;
                case 2:
                    //ASCII在97-122之间为小写，获取小写随机
                    uid.append((char)(rd.nextInt(25)+97));
                    break;
                default:
                    break;
            }
        }
        return uid.toString();
    }

    public static void main(String[] args) {
        BaseUtil util = new BaseUtil();
        String appid= util.buildWebUrlCode();
        System.out.println("WebUrlCode:"+appid);
        System.out.println("WebUrlCodeLength:"+appid.length());
    }
}
